﻿/******************************************************************************
 * 文件名: array_sort_implementation.c
 * 作者: 袁德明
 * 创建日期: 2025年9月15日
 * 描述: 
 *   例题6.10 - 数组排序实现
 *   演示使用选择排序算法对数组进行升序排列
 *   通过函数封装排序逻辑，提高代码的可重用性和可读性
 * 
 * 程序功能：
 *   1. 输入10个整数到数组中
 *   2. 使用选择排序算法对数组进行升序排列
 *   3. 输出排序后的数组内容
 * 
 * 技术要点：
 *   - 选择排序算法的实现
 *   - 数组作为函数参数传递
 *   - 指针与数组的关系
 *   - 嵌套循环在排序算法中的应用
 * 
 * 注意事项：
 *   - 选择排序算法的时间复杂度为O(n²)
 *   - 数组作为函数参数时，实际传递的是数组首元素的地址
 *   - 函数内部可以直接修改主函数中的数组内容
 ******************************************************************************/

#include <stdio.h>  /* 标准输入输出头文件 */

/* 定义常量 */
#define ARRAY_SIZE 10    /* 数组大小 */

/**
 * @brief 使用选择排序算法对数组进行升序排列
 * 
 * 选择排序算法原理：
 * 1. 从第一个元素开始，依次与后面的元素比较
 * 2. 如果找到比当前元素更小的元素，则交换它们的位置
 * 3. 每一轮循环后，当前最小的元素会被放置在正确的位置
 * 
 * @param array 待排序的数组
 * @param size 数组的大小
 * @return void 无返回值
 */
void sortArray(int array[], int size)
{
    int outerIndex;  /* 外层循环索引 */
    int innerIndex;  /* 内层循环索引 */
    int temp;        /* 临时变量，用于交换值 */
    
    /* 参数有效性检查 */
    if (array == NULL || size <= 0)
    {
        printf("错误: 无效的数组参数\n");
        return;
    }
    
    /* 外层循环：从第一个元素到倒数第二个元素 */
    for (outerIndex = 0; outerIndex < size - 1; outerIndex++)
    {
        /* 内层循环：从当前元素的下一个元素到最后一个元素 */
        for (innerIndex = outerIndex + 1; innerIndex < size; innerIndex++)
        {
            /* 如果当前元素大于后续元素，则交换它们的位置 */
            if (array[outerIndex] > array[innerIndex])
            {
                temp = array[outerIndex];
                array[outerIndex] = array[innerIndex];
                array[innerIndex] = temp;
            }
        }
    }
}

/**
 * @brief 主函数 - 数组排序程序
 * 
 * 程序功能：
 * 1. 输入10个整数到数组中
 * 2. 调用排序函数对数组进行升序排列
 * 3. 输出排序后的数组内容
 * 
 * @return int 程序执行状态码
 *             - 0: 正常执行
 *             - 1: 输入错误
 */
int main(void)
{
    int numberArray[ARRAY_SIZE];    /* 定义包含10个元素的整型数组 */
    int *arrayPointer;              /* 指向数组的指针 */
    int index;                      /* 循环计数器 */

    /* 初始化指针指向数组起始位置 */
    arrayPointer = numberArray;

    /* 输入提示 */
    printf("请输入 %d 个整数:\n", ARRAY_SIZE);

    /* 使用指针遍历数组并输入元素值 */
    for (index = 0; index < ARRAY_SIZE; index++)
    {
        printf("请输入第 %d 个整数: ", index + 1);
        
        /* 通过指针输入数组元素值 */
        if (scanf("%d", arrayPointer) != 1)
        {
            printf("输入错误! 程序终止。\n");
            return 1; /* 返回错误状态码 */
        }
        
        /* 指针递增，指向下一个数组元素 */
        arrayPointer++;
    }

    /* 重置指针指向数组起始位置 */
    arrayPointer = numberArray;

    /* 输出原始数组内容 */
    printf("\n原始数组内容:\n");
    for (index = 0; index < ARRAY_SIZE; index++)
    {
        printf("%3d", *arrayPointer);
        arrayPointer++;
    }
    printf("\n");

    /* 重置指针指向数组起始位置 */
    arrayPointer = numberArray;

    /* 调用函数对数组进行排序 */
    sortArray(arrayPointer, ARRAY_SIZE);

    /* 重置指针指向数组起始位置 */
    arrayPointer = numberArray;

    /* 输出排序后的数组内容 */
    printf("排序后的数组内容(升序): \n");
    for (index = 0; index < ARRAY_SIZE; index++)
    {
        printf("%3d", *arrayPointer);
        arrayPointer++;
    }
    printf("\n");

    /* 程序正常结束 */
    return 0;
}